/*Arquivo que contem a lógica do mapa e suas camadas*/

/*Função de inicialização dos mapas*/
$(document).ready(function init_mapOpenLayers() {
    
    /*Váriaveis de configuração criação do mapa
     Obs: não foi específicado na referência*/
    A = "EPSG:4326";
    B = "EPSG:900913";

    /*Proxy do host para obter dados das camadas, necessário arquivo proxy.jsp*/
    OpenLayers.ProxyHost = window.location.protocol + "//" + window.location.host + window.location.pathname + "proxy.jsp?";

    /*Cria o mapa com os paramêtros do openlayers com as configurações das variáveis
     * e atribui a váriavel map*/
    map = new OpenLayers.Map('map', {
        projection: new OpenLayers.Projection(B),
        displayProjection: new OpenLayers.Projection(A),
        controls: [
            new OpenLayers.Control.Navigation(),
            new OpenLayers.Control.ScaleLine(),
            new OpenLayers.Control.LayerSwitcher({
                'ascending': false}),
            new OpenLayers.Control.OverviewMap()]
    });
    
    /*Cria camada de estados*/
    layerRegiao = new OpenLayers.Layer.WMS("REGIAO",
            "http:///localhost:8080/geoserver/wms", {layers:
                        'TB_REGIAO', transparent: true}, {isBaseLayer: false, displayInLayerSwitcher: true});

    /*Cria layer de refêrncia do Google*/
    var layerGooglePhysical = new OpenLayers.Layer.Google("Google Physical", {
        type: google.maps.MapTypeId.TERRAIN,
        sphericalMercator: true});
    
    var layerGoogleStreets = new OpenLayers.Layer.Google(
    "Google Streets", // the default
    {numZoomLevels: 20});
    
    var layerGoogleSatellite = new OpenLayers.Layer.Google(
            "Google Satellite",
            {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}
    // used to be {type: G_SATELLITE_MAP, numZoomLevels: 22}
    );
    
    /*Cria camada de desenho*/
    drawLayer = new OpenLayers.Layer.Vector("Draw Layer");

    /*Adiciona camada Google a camada dos openlayers*/
    map.addLayers([layerGooglePhysical, layerGoogleStreets, layerGoogleSatellite, layerRegiao, drawLayer]);

    /*Estilo camada regiao*/
    layerRegiao.mergeNewParams({
        "styles": "teste"
    });

    layerRegiao.setVisibility(false);

    /*Seta a visualização do mapa para o mapa do Brasil*/
    map.setCenter(new OpenLayers.LonLat(-49.57081, -16.13026).transform(A, B), 4);
    /*Atribui controles ao array*/
    navigationControls = {
        /*Controle de zoom em área*/
        zoomBox: new OpenLayers.Control.ZoomBox()
    };
    /*Adiciona controle de navegação aos mapas*/
    for (controls in navigationControls) {
        map.addControl(navigationControls[controls]);
    }

    /*Função para criação de cluster*/ /*Vincular no botão*/
});

/*Função para randomizar ponto de cluster*/
function insertRandomPointMap() {
    var x = generateNumberRandom(500, 680);
    var y = generateNumberRandom(100, 140);
    var lonlat = map.getLonLatFromPixel(new OpenLayers.Pixel(x, y));

    return new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);
}

/*função que auxilia randomPoint, tem número minimo e maximo como entrada
 * de parametros*/
function generateNumberRandom(min, max) {
    var delta = max - min;
    var random = Math.floor(Math.random() * (delta + 1));

    return min + random;
}

function createFeaturePoint() {
    // criando Pontos no mapa
    points = [];
    for (var i = 0; i < 1000; i++) {
        var point = insertRandomPointMap();
        var pointFeature = new OpenLayers.Feature.Vector(point);
        points.push(pointFeature);
    }
}

function createHeatMapOpenLayers() { /*mapa*/
    /*---------------------------------HeatMap--------------------------------*/
    var raster = new OpenLayers.Layer.OSM("osm");
    /*Cria layer para heatmap*/
    layerHeatMap = new OpenLayers.Layer.Vector("heatmap", {
// use the heatmap renderer instead of the default one (SVG, VML or Canvas)
        renderers: ['Heatmap'],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "data.geojson",
            format: new OpenLayers.Format.GeoJSON()

        }),
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                pointRadius: 20,
                weight: "${weight}"
            }, {
                context: {
// the 'weight' of the point (between 0.0 and 1.0), used by the heatmap renderer
                    weight: function(f) {
                        return Math.min(Math.max((f.attributes.duration || 0) / 43200, 0.25), 1.0);
                    }
                }
            })
        }),
        strategies: [new OpenLayers.Strategy.Fixed()],
        eventListeners: {
            featuresadded: function(evt) {
                this.map.zoomToExtent(this.getDataExtent());
            }
        }
    });
    map.addLayers([layerHeatMap, raster]);

    layerHeatMap.setVisibility(false);
}

function createClusterMapOpenLayers() {
    /*--------------------------------Cluster--------------------------------*/
    /*Função para criação de pontos*/
    createFeaturePoint();
    //Criando Clusters
    var strategy;

    /*Cria estilo para cluster*/
    var style = new OpenLayers.Style({
        pointRadius: "${radius}",
        fillColor: "#ffcc66",
        fillOpacity: 0.8,
        strokeColor: "#cc6633",
        strokeWidth: "${width}",
        strokeOpacity: 0.8
    }, {
        context: {
            width: function(feature) {
                return (feature.cluster) ? 2 : 1;
            },
            radius: function(feature) {
                var pix = 2;
                if (feature.cluster) {
                    pix = Math.min(feature.attributes.count, 7) + 2;
                }
                return pix;
            }
        }
    });
    
     //Cria estrategia para cluster
    strategy = new OpenLayers.Strategy.Cluster();
    
         /*Aplicando a camada cluster*/
    clusters = new OpenLayers.Layer.Vector("Clusters", {
        strategies: [strategy],
        styleMap: new OpenLayers.StyleMap({
            "default": style,
            "select": {
                fillColor: "#8aeeef",
                strokeColor: "#32a8a9"
            }
        })
    });
    
       map.addLayer(clusters);

    var select = new OpenLayers.Control.SelectFeature(
            clusters, {hover: true}
    );
    map.addControl(select);
    select.activate();

    var distance = 50;
    var threshold = 1;
    strategy.distance = distance || strategy.distance;
    strategy.threshold = threshold || strategy.threshold;
    clusters.removeFeatures(clusters.points);
    clusters.addFeatures(points);
    /*Seta a camada de ckuster não visivel*/
    clusters.setVisibility(false);
    /*------------------------------FimCluster--------------------------------*/
}
